﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

namespace Touchscreen
{
    public partial class Stap3 : System.Web.UI.Page
    {
        private Voorstelling v;
        private decimal totalprice;
        private List<int> gebruikteStoelen;
        private List<int> gebruikteRijen = new List<int>();

        protected void Page_Load(object sender, EventArgs e)
        {
            gebruikteStoelen = new List<int>();

            v = (Voorstelling)Session["voorstelling"];
            totalprice = 0;

            if (v == null)
            {
                Response.Redirect("Stap1.aspx");
            }
            else
            {
                initComponents();

                int totalTickets = (int)Session["adults"] + (int)Session["childeren"] + (int)Session["50plus"] + (int)Session["students"];
                List<Stoel> vrijestoelen = getFreeChairs();

                if (vrijestoelen.Count() >= totalTickets)
                {
                    showPriceOverview();

                    if (!Page.IsPostBack)
                    {

                        // Kijk of iedereen op één rij geplaatst kan worden. Zo ja, haal vrijestoelen leeg
                        // en voeg alleen de vrije stoelen uit de desbetreffende rij toe.
                        if (totalTickets > 1)
                        {
                            bool foundrow = false;

                            var rijen = from r in v.Zaal.Rijs
                                        orderby r.nummer descending
                                        select r;

                            foreach (var r in rijen)
                            {
                                var stoelen = from s in vrijestoelen
                                              where s.rij_nummer == r.nummer
                                              select s;

                                int temp = stoelen.Count();

                                if (stoelen.Count() >= totalTickets)
                                {
                                    List<Stoel> stoelenineenrij = new List<Stoel>();

                                    foreach (var s in stoelen)
                                    {
                                        stoelenineenrij.Add(s);
                                    }

                                    vrijestoelen = stoelenineenrij;
                                    foundrow = true;
                                    break;
                                }
                            }

                            if (foundrow == false)
                            {
                                LabelMessage.Visible = true;
                                LabelMessage.ForeColor = Color.Red;
                                LabelMessage.Text = "Let op! U zit niet op één rij.";
                            }
                        }

                        for (int i = 0; i < (int)Session["adults"]; i++)
                        {
                            Stoel stoel = vrijestoelen.First();
                            LabelRowAdult.Visible = true;
                            LabelChairAdult.Visible = true;

                            if (!LabelRowAdult.Text.Contains(stoel.rij_nummer.ToString())) { LabelRowAdult.Text += stoel.rij_nummer.ToString() + ", "; }
                            LabelChairAdult.Text += stoel.nummer.ToString() + ", ";                 

                            Ticket ticket = new Ticket { stoel_nummer = stoel.nummer, rij_nummer = stoel.rij_nummer, zaal_nummer = stoel.zaal_nummer, voorstelling_datumtijd = v.datumtijd, film_naam = v.film_naam, tickettype_naam = "volwassen" };
                            vrijestoelen.Remove(stoel);
                            Module.database.Tickets.InsertOnSubmit(ticket);
                            gebruikteStoelen.Add(stoel.nummer);
                            gebruikteRijen.Add(stoel.rij_nummer);
                        }

                        if (LabelRowAdult.Text.Length > 2) { LabelRowAdult.Text = LabelRowAdult.Text.Substring(0, LabelRowAdult.Text.Length - 2); }
                        if (LabelChairAdult.Text.Length > 2) { LabelChairAdult.Text = LabelChairAdult.Text.Substring(0, LabelChairAdult.Text.Length - 2); }

                        for (int i = 0; i < (int)Session["childeren"]; i++)
                        {
                            Stoel stoel = vrijestoelen.First();
                            LabelRowChild.Visible = true;
                            LabelChairChild.Visible = true;

                            if (!LabelRowChild.Text.Contains(stoel.rij_nummer.ToString())) { LabelRowChild.Text += stoel.rij_nummer.ToString() + ", "; }
                            LabelChairChild.Text += stoel.nummer.ToString() + ", ";

                            Ticket ticket = new Ticket { stoel_nummer = stoel.nummer, rij_nummer = stoel.rij_nummer, zaal_nummer = stoel.zaal_nummer, voorstelling_datumtijd = v.datumtijd, film_naam = v.film_naam, tickettype_naam = "kind" };
                            vrijestoelen.Remove(stoel);
                            Module.database.Tickets.InsertOnSubmit(ticket);
                            gebruikteStoelen.Add(ticket.stoel_nummer);
                            gebruikteRijen.Add(stoel.rij_nummer);
                        }

                        if (LabelRowChild.Text.Length > 2) { LabelRowChild.Text = LabelRowChild.Text.Substring(0, LabelRowChild.Text.Length - 2); }
                        if (LabelChairChild.Text.Length > 2) { LabelChairChild.Text = LabelChairChild.Text.Substring(0, LabelChairChild.Text.Length - 2); }

                        for (int i = 0; i < (int)Session["50plus"]; i++)
                        {
                            Stoel stoel = vrijestoelen.First();
                            LabelRowOldpeople.Visible = true;
                            LabelChairOldpeople.Visible = true;

                            if (!LabelRowOldpeople.Text.Contains(stoel.rij_nummer.ToString())) { LabelRowOldpeople.Text += stoel.rij_nummer.ToString() + ", "; }
                            LabelChairOldpeople.Text += stoel.nummer.ToString() + ", ";

                            Ticket ticket = new Ticket { stoel_nummer = stoel.nummer, rij_nummer = stoel.rij_nummer, zaal_nummer = stoel.zaal_nummer, voorstelling_datumtijd = v.datumtijd, film_naam = v.film_naam, tickettype_naam = "50+" };
                            vrijestoelen.Remove(stoel);
                            Module.database.Tickets.InsertOnSubmit(ticket);
                            gebruikteStoelen.Add(stoel.nummer);
                            gebruikteRijen.Add(stoel.rij_nummer);
                        }

                        if (LabelRowOldpeople.Text.Length > 2) { LabelRowOldpeople.Text = LabelRowOldpeople.Text.Substring(0, LabelRowOldpeople.Text.Length - 2); }
                        if (LabelChairOldpeople.Text.Length > 2) { LabelChairOldpeople.Text = LabelChairOldpeople.Text.Substring(0, LabelChairOldpeople.Text.Length - 2); }

                        for (int i = 0; i < (int)Session["students"]; i++)
                        {
                            Stoel stoel = vrijestoelen.First();
                            LabelRowStudent.Visible = true;
                            LabelChairStudent.Visible = true;

                            if (!LabelRowStudent.Text.Contains(stoel.rij_nummer.ToString())) { LabelRowStudent.Text += stoel.rij_nummer.ToString() + ", "; }
                            LabelChairStudent.Text += stoel.nummer.ToString() + ", ";

                            Ticket ticket = new Ticket { stoel_nummer = stoel.nummer, rij_nummer = stoel.rij_nummer, zaal_nummer = stoel.zaal_nummer, voorstelling_datumtijd = v.datumtijd, film_naam = v.film_naam, tickettype_naam = "CJP/student" };
                            vrijestoelen.Remove(stoel);
                            Module.database.Tickets.InsertOnSubmit(ticket);
                            gebruikteStoelen.Add(stoel.nummer);
                            gebruikteRijen.Add(stoel.rij_nummer);
                        }

                        Session["Stoelen"] = gebruikteStoelen;
                        Session["Rijen"] = gebruikteRijen;


                        if (LabelRowStudent.Text.Length > 2) { LabelRowStudent.Text = LabelRowStudent.Text.Substring(0, LabelRowStudent.Text.Length - 2); }
                        if (LabelChairStudent.Text.Length > 2) { LabelChairStudent.Text = LabelChairStudent.Text.Substring(0, LabelChairStudent.Text.Length - 2); }
                    }
                }
                else
                {
                    LabelMessage.Text = "Er zijn niet genoeg plaatsen. Er zijn nog " + vrijestoelen.Count() + " stoel(en) vrij. Ga terug...";
                    ButtonNext.Enabled = false;
                }
            }
        }

        private void initComponents()
        {
            Master.labelExplain.Text = "Prijs overzicht";
            Movie movie = (Movie)LoadControl("Movie.ascx");
            movie.voorstelling = v;
            Panel.Controls.Add(movie);

            Button b = new Button();
            b.Text = "Annuleren";
            b.BackColor = Color.Red;
            b.CssClass = "ButtonCancelPlaceHolder";
            b.PostBackUrl = "Stap1.aspx";
            movie.panelParentGuide.Controls.Add(b);
        }

        //Het prijzenoverzicht deel.
        private void showPriceOverview()
        {
            var tickettypes = from t in Module.database.Tickettypes
                              select t;

            LabelCount.Visible = true;
            LabelType.Visible = true;
            LabelRow.Visible = true;
            LabelChair.Visible = true;
            LabelPrice.Visible = true;

            //De labels alleen aanzetten en invullen bij de tickettypes die de klant ook wilt kopen.
            foreach (var t in tickettypes)
            {
                switch (t.naam)
                {
                    case "3D Bril":
                        int driedglasses = (int)Session["3dglasses"];
                        if (driedglasses > 0)
                        {
                            LabelNumber3D.Visible = true;
                            LabelType3D.Visible = true;
                            LabelPrice3d.Visible = true;

                            LabelNumber3D.Text = Convert.ToString(driedglasses) + "x";
                            LabelType3D.Text = t.naam;
                            LabelPrice3d.Text = String.Format("&euro; {0:0.00}", driedglasses * t.prijs);
                            totalprice += (driedglasses * t.prijs);
                        }
                        break;

                    case "50+":
                        int fiftyplus = (int)Session["50plus"];
                        if (fiftyplus > 0)
                        {
                            LabelNumberOldPeople.Visible = true;
                            LabelTypeOldpeople.Visible = true;
                            LabelPriceOldPeople.Visible = true;

                            LabelNumberOldPeople.Text = Convert.ToString(fiftyplus) + "x";
                            LabelTypeOldpeople.Text = t.naam;
                            LabelPriceOldPeople.Text = String.Format("&euro; {0:0.00}", fiftyplus * t.prijs);
                            totalprice += (fiftyplus * t.prijs);
                        }
                        break;

                    case "CJP/student":
                        int students = (int)Session["students"];
                        if (students > 0)
                        {
                            LabelNumberStudent.Visible = true;
                            LabelTypeStudent.Visible = true;
                            LabelPriceStudent.Visible = true;

                            LabelNumberStudent.Text = Convert.ToString(students) + "x";
                            LabelTypeStudent.Text = t.naam;
                            LabelPriceStudent.Text = String.Format("&euro; {0:0.00}", students * t.prijs);
                            totalprice += (students * t.prijs);
                        }
                        break;

                    case "kind":
                        int childeren = (int)Session["childeren"];
                        if (childeren > 0)
                        {
                            LabelNumberChild.Visible = true;
                            LabelTypeChild.Visible = true;
                            LabelPriceChild.Visible = true;

                            LabelNumberChild.Text = Convert.ToString(childeren) + "x";
                            LabelTypeChild.Text = t.naam;
                            LabelPriceChild.Text = String.Format("&euro; {0:0.00}", childeren * t.prijs);
                            totalprice += (childeren * t.prijs);
                        }
                        break;

                    case "volwassen":
                        int adults = (int)Session["adults"];
                        if (adults > 0)
                        {
                            LabelNumberAdult.Visible = true;
                            LabelTypeAdult.Visible = true;
                            LabelPriceAdult.Visible = true;

                            LabelNumberAdult.Text = Convert.ToString(adults) + "x";
                            LabelTypeAdult.Text = t.naam;
                            LabelPriceAdult.Text = String.Format("&euro; {0:0.00}", adults * t.prijs);
                            totalprice += (adults * t.prijs);
                        }
                        break;
                }
            }

            LabelPriceTotal.Text = String.Format("Totaal: &euro; {0:0.00}", totalprice);
        }

        //Vrije stoelen ophalen
        private List<Stoel> getFreeChairs()
        {
            var stoelen = from s in Module.database.Stoels
                          where s.zaal_nummer == v.zaal_nummer
                          orderby s.rij_nummer descending, s.nummer ascending
                          select s;

            List<Stoel> vrijestoelen = new List<Stoel>();

            foreach (var s in stoelen)
            {
                var ticket = from t in Module.database.Tickets
                             where t.Stoel == s && t.Voorstelling == v
                             select t;

                if (ticket.Count() == 0)
                {
                    vrijestoelen.Add(s);
                }
            }

            return vrijestoelen;
        }

        protected void ButtonNext_Click(object sender, EventArgs e)
        {
            Session["totalprice"] = totalprice;
            Response.Redirect("Stap4.aspx");
        }
    }
}